\documentclass[a4paper]{article}
\usepackage[a4paper,margin=1.6cm,top=2.0cm,bottom=2.34cm]{geometry}
\usepackage[spanish,activeacute]{babel}
\usepackage[T1]{fontenc}
\usepackage{algo2symb}
\usepackage{newalgo}

\parskip=1.5ex
\pagestyle{empty}

\newcommand\interfaz[5]{\noindent \\#1\ifblank{#2}\then{}\else{(#2)}\fi \ifblank{#3}\then{}\else{$\rightarrow$ #3}\fi \\ \{$#4$\} \\ \{$#5$\}}
\newcommand\estr[2]{\noindent \textbf{Estructura} \\#1 src estr\_#1 donde estr\_#1 es:\\ #2}
\newcommand\rep[2]{\noindent \textbf{Invariante de representacion} \\Rep: estr\_#1 $\rightarrow$ bool\\ Rep(e) = #2}
\newcommand\abs[3]{\noindent \textbf{Funcion de abstraccion} \\Abs:estr\_ #1 e $\rightarrow$ #1 Rep(e)\\ Abs(e) = #2 / \\ #3}

\begin{document}

\begin{center}\textbf{\Large M'odulo \nombretad{pendientes}}\\
Se explica con la especificaci'on de \texttt{pendientes} y de \texttt{iterPendientes}
\end{center}

\textbf{usa:} lista, arreglo\_dimensionable, catalogo

\noindent \textbf{Interfaz}

% todo esto era porque lo haciamos sobre lista!

%\noindent \comentario{O(1)}
%\interfaz{EsVacia}{\param{in}{p}{pendientes}}{res\!: bool}{true}{res \igobs vacia?(p)}

%\noindent \comentario{O(1)}
%\interfaz{Prim}{\param{in}{p}{pendientes}}{res\!: vivienda}{\neg vacia?(p)}{res \igobs prim(p)}

%\noindent \comentario{O(1) O(t) ?}
%\interfaz{Fin}{\param{in}{p}{pendientes}}{res\!: pendientes}{\neg vacia?(p)}{p \igobs fin(p)}

\noindent \comentario{Complejidad: O(n) Donde n es el numero de viviendas del catalogo. Agregamos un parametro que representa la cantidad de materiales del catalogo. Como en constructora igual lo tenemos que calcular, No queremos volver a hacerlo.}
\interfaz{Vacia}{\param{in}{c}{catalogo}, \param{in}{n}{nat}}{res\!: pendientes}{true}{res \igobs Vacia(c)}

\noindent \comentario{Complejidad: O(1)}
\interfaz{Encolar}{\param{in}{v}{vivienda}, \param{inout}{p}{pendientes}}{}{p \igobs {p}_{0} \wedge v \in Catalogo(p)}{p \igobs Encolar({p}_{0},v)}

\noindent \comentario{Complejidad: O(t), donde t es la cantidad de elementos encolados}
\interfaz{Cola}{\param{in}{p}{pendientes}}{res\!: lista(vivienda)}{true}{res \igobs Cola(p)}

\noindent \comentario{Complejidad: O(1). Devuelve por aliasing}
\interfaz{Catalogo}{\param{in}{p}{pendientes}}{res\!: catalogo}{true}{res \igobs Catalogo(p)}

\noindent \comentario{Complejidad: O(t), donde t es la cantidad de elementos encolados}
\interfaz{Esta}{\param{in}{v}{vivienda}, \param{in}{p}{pendientes}}{res\!: bool}{true}{res \igobs esta?(v,Cola(p))}

%\noindent \comentario{Complejidad: O(1)}
%\interfaz{Borrar}{\param{inout}{it}{iterPendientes}}{}{\neg Vacia(VerSecuSuby(it)) \wedge it \igobs {it}_{0}}{it \igobs Eliminar({it}_{0})}

%\noindent \comentario{Complejidad: O(1)}
%\interfaz{CrearIterViviendas}{\param{in}{p}{pendientes}}{res\!: iterLista}{true}{res \igobs CrearIter(p)}



\noindent \comentario{Complejidad: O(1)}
\interfaz{CrearIterPendientes}{\param{in}{m}{material}, \param{in}{p}{pendientes}}{res\!: iterPendientes}{m \in TodosLosMateriales(Catalogo(p))}{res \igobs CrearIterPendientes(p,viviendasPorMaterial(p,m),m)}

\noindent \comentario{Complejidad: O(1)}
\interfaz{tieneProximo}{\param{in}{it\_p}{IterPendientes}}{res\!: bool}{true}{res \igobs \neg Vacia?(VerSecuSuby(it\_p))}

\noindent \comentario{Complejidad: O(1)}
\interfaz{actual}{\param{in}{it\_p}{iterPendientes}}{res\!: vivienda}{\neg Vacia(VerSecuSuby(it\_p))}{res \igobs prim(VerSecuSuby(it\_p))}

\noindent \comentario{Complejidad: O(1)}
\interfaz{eliminar}{\param{inout}{it\_p}{iterPendientes}}{}{it\_p_0 \igobs it\_p \wedge \neg Vacia(VerSecuSuby(it\_p))}{it\_p \igobs eliminar(it\_p_0)}

\noindent \comentario{Complejidad: O(1)}
\interfaz{avanzar}{\param{inout}{it\_p}{iterPendientes}}{}{it\_p_0 \igobs it\_p \wedge \neg Vacia(VerSecuSuby(it\_p))}{VerSecuSuby(it\_p) \igobs fin(VerSecuSuby(it\_p_0)) \wedge VerFiltrados(it\_p) \igobs VerFiltrados(it\_p_0)}

\newpage

\estr{pendientes}{\trupla{cola:lista(nodoCola)}{catalogo: catalogo}{porMaterial: arreglo\_dimensionable(lista(nodoMat))}}

Donde nodoCola es \dupla{vivienda: vivienda}{nodosEnMateriales: lista(iterLista(nodoMat))}

Donde nodoMat es iterlista(nodoCola)

iterPendientes src iterLista(nodoMat)

\rep{pendientes}{estanLosMateriales $\wedge$ viviendasEnCatalogo $\wedge$ estanEnPorMaterial $\wedge$ estanLasViviendas}

\noindent \comentario{Todo material que use alguna vivienda del catalogo debe pertenecer al arreglo porMaterial}

\noindent estanLosMateriales $\equiv $ tam(p.porMaterial) = CantidadMateriales(p.catalogo)

\noindent \comentario{Toda vivienda debe estar en el catalogo}

\noindent viviendasEnCatalogo $\equiv$ ($\forall$ v: \dupla{vivienda}{lista(iterLista)}, v $\in$ p.cola) ${\Pi}_{1}(v)$ $\in$ Viviendas(p.catalogo)

\noindent estanEnPorMateriales $\equiv$ \textit{Para toda tupla en la cola, por cada material que use la vivienda de la tupla segun el catalogo, hay un iterador en la lista de la tupla que apunta a un nodo de una lista que cuelga de la posicion $'$material$'$ en p.porMaterial}

\noindent estanLasViviendas $\equiv$ \textit{Para todo iterador en la lista de alguna posicion $'$material$'$ de p.porMaterial, ese iterador apunta a una tupla asociada a una vivienda en p.cola que usa ese material(segun el catalogo)}

\rep{iterPendientes}{true}

\abs{pendientes}{p}{Cola(p) \igobs Cola(e) $\wedge$ Catalogo(p) \igobs Abs(e.catalogo)}

\abs{iterPendientes}{itp}{VerSecuSuby(itp) \igobs \lif tieneProximo(e) \lthen Abs(Actual(e)) $\bullet$ Abs(VerSecuSuby(Avanzar(e))) \lelse <> \lfi \\ $\wedge$ VerFiltrados(itp) \igobs Abs(Lista(e))}

\medskip
\medskip
\medskip
\medskip
\medskip


\noindent \textbf{Algoritmos} \\

%\begin{algorithm}{iEsVacia}{\param{in}{p}{estr\_pendientes}}{res\!: bool}
%res \= iEsVacia(p.cola)
%\end{algorithm}

%\begin{algorithm}{iPrimero}{\param{in}{p}{estr\_pendientes}}{res\!: vivienda}
%	res \= iPrimero(p.cola)
%\end{algorithm}

%\begin{algorithm}{iFin}{\param{in}{p}{estr\_pendientes}}{res\!: pendientes}
%	res \= p
%	\VAR{it\!: iterLista} \= CrearIterViviendas(p)
%	res \= iBorrar(it,res)
%\end{algorithm}

\begin{algorithm}{iVacia}{\param{in}{c}{catalogo},\param{in}{n}{nat}}{res\!: estr\_pendientes}
	res \= $\trupla{cola: iNueva}{catalogo: c}{porMaterial: iCrearArreglo(n)}$ \\
	\VAR{i\!: nat} \= 0 \\
	\begin{WHILE}{i<n}
		res.PorMaterial[i] \= iNueva
	\end{WHILE}\\
	\comentario{Todas las lineas son en \Ode{1} y hace las lineas 3 y 4 n veces}\\
	\comentario{Complejidad: \Ode{n}}
\end{algorithm}

\begin{algorithm}{iEncolar}{\param{in}{v}{vivienda}, \param{inout}{p}{estr\_pendientes}}{}
	iAgregarAtras(<v \times iNueva>, p.cola) \\
	\VAR{it\!: iterMateriales} \= iCrearIterMateriales(p.catalogo,v) \\
	\VAR{posEnCola\!: iterLista(nodoCola)} \= iCrearItAlUlt(p.cola) \\
	\begin{WHILE}{iTieneProximo(it)}
		%listaPorMaterial \= p.porMaterial[iActual(it).material] \\
		%punteroVivienda \=  p.cola.ultimo \\
		\VAR{actual\!:material} \= iAvanzar(it)\\
		iAgregarAtras(posEnCola, p.porMaterial[actual]) \\
		iAgregarAtras(iCrearItAlUlt(p.porMaterial[actual]),ultimo(p.cola).nodosEnMateriales)
	\end{WHILE}\\
	\comentario{Todas las lineas son \Ode{1} y el ciclo itera sobre los materiales de una vivienda, que es \Ode{1}}\\
	\comentario{Complejidad: \Ode{1}}
\end{algorithm}

\begin{algorithm}{iCola}{\param{in}{p}{pendientes}}{res\!: lista(vivienda)}
	res \= iNueva() \\
	\VAR{it\!: iterLista(nodoCola)} \= iCrearIt(p.cola) \\
	\begin{WHILE}{iTieneProximo(it)}
		Agregar(iActual(it).vivienda,res) \\
		iAvanzar(it)
	\end{WHILE}\\
	\comentario{Todas las lineas son \Ode{1} y el ciclo itera las viviendas pendientes}\\
	\comentario{Complejidad: \Ode{\texttt{cantidad\_viviendas\_pendientes}}}
\end{algorithm}

\begin{algorithm}{iCatalogo}{\param{in}{p}{pendientes}}{res\!: catalogo}
	res \= p.catalogo \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iEsta}{\param{in}{v}{vivienda}, \param{in}{p}{estr\_pendientes}}{res\!: Bool}
	res \= false \\
	\VAR{it\!: iterLista(nodoCola)} \= iCrearIt(p.cola) \\
	\begin{WHILE}{iTieneProximo(it) \wedge \neg res}
		\begin{IF}{iActual(it).vivienda = v}
			res \= true
		\end{IF} \\
		iAvanzar(it)
	\end{WHILE}\\
	\comentario{Todas las lineas son \Ode{1} y el ciclo itera sobre las viviendas pendientes}\\
	\comentario{Complejidad:  \Ode{\texttt{cantidad\_viviendas\_pendientes}}}
\end{algorithm}



%\begin{algorithm}{iBorrar}{\param{inout}{it}{iterLista}, \param{inout}{p}{pendientes}}{}
%	\VAR{m\!: iterLista} \= {\Pi}_{2}(iActual(it)) \\
%	\begin{WHILE}{iTieneProximo(m)}
%		iEliminar(iActual(m),Lista(it).porMaterial[iActual(iActual(m))]) \\
%		iEliminar(m,iActual(it).nodosEnMateriales) \\
%		iAvanzar(m)
%	\end{WHILE} \\
%	iEliminar(it)
%\end{algorithm}

\begin{algorithm}{iCrearIterPendientes}{\param{in}{m}{material},\param{in}{p}{estr\_pendientes}}{res\!: iterPendientes}
	res \= iCrearIt(p.porMaterial[m]) \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iTieneProximo}{\param{in}{it\_p}{iterPendientes}}{res\!: bool}
	res\= iTieneProximo(it\_p)  \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iActual}{\param{in}{it\_p}{iterPendientes}}{res\!: vivienda}
	res \= iActual(iActual(it\_p)).vivienda  \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iAvanzar}{\param{inout}{it\_p}{iterPendientes}}{}
	iAvanzar(it\_p)	\comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iEliminar}{\param{inout}{it\_p}{iterPendientes}}{}
	\VAR{iterVivienda \!: iterLista(nodoCola)} \= {iActual(it\_p)} \\
	\VAR{it\!: iterLista(iterLista(nodoMat))} \= {crearIt(iActual(iterVivienda).nodosEnMateriales)}	\\
	\begin{WHILE}{iTieneProximo(it)}
		iEliminar(iActual(it))\\
		iAvanzar(it)
	\end{WHILE}\\
iEliminar(iterVivienda)\\
\comentario{Todas las operaciones son \Ode{1} y el ciclo itera sobre la lista nodosEnMateriales de una vivienda pendiente}\\
\comentario{cuya logitud es la cantidad de materiales de esa vivienda (\Ode{1})}\\
\comentario{Complejidad: \Ode{1}}
\end{algorithm}


\end{document}
